#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include "TcpServer.h"
#include "HttpServer.h"
#include "WorkerThreadPool.h"
#include "block_log.h"

int main(int argc, char* argv[])
{
    unsigned short tcpPort = 8888;   // TCP服务器端口（长连接）
    unsigned short httpPort = 8080;  // HTTP服务器端口（文件下载）
    
    // 如果提供了命令行参数，则使用指定端口
    if (argc >= 2)
    {
        tcpPort = atoi(argv[1]);
        printf("使用指定TCP端口: %d\n", tcpPort);
    }
    else
    {
        printf("使用默认TCP端口: %d\n", tcpPort);
    }
    
    if (argc >= 3)
    {
        httpPort = atoi(argv[2]);
        printf("使用指定HTTP端口: %d\n", httpPort);
    }
    else
    {
        printf("使用默认HTTP端口: %d\n", httpPort);
    }
    
    // 初始化业务线程池（必须先初始化，BlockLog需要用到）
    printf("正在初始化业务线程池...\n");
    try {
        WorkerThreadPool::getInstance()->init();
        printf("✓ 业务线程池初始化完成\n");
    } catch (const std::exception& e) {
        printf("✗ 业务线程池初始化失败: %s\n", e.what());
        return 1;
    }
    
    // 初始化日志系统（依赖WorkerThreadPool）
    printf("正在初始化日志系统...\n");
    BlockLog::getInstance()->init("mylog.log", 0, 8192, 10000, 500);
    printf("✓ 日志系统初始化完成\n");
    
    // 启动HTTP文件服务器（独立线程）
    printf("正在启动HTTP文件服务器...\n");
    HttpServer* httpServer = new HttpServer(".", httpPort);
    if (httpServer->start()) {
        printf("✓ HTTP文件服务器启动成功，端口: %d\n", httpPort);
        printf("  访问示例: http://localhost:%d/uploads/avatars/xxx.jpg\n", httpPort);
    } else {
        printf("✗ HTTP文件服务器启动失败\n");
    }
    
    // 启动TCP服务器（主线程，阻塞运行）
    printf("✓ TCP服务器启动中，端口: %d\n", tcpPort);
    TcpServer* tcpServer = new TcpServer(tcpPort, 4);
    tcpServer->run();  // 阻塞运行
    
    // 清理资源（实际上run()会一直阻塞，不会执行到这里）
    httpServer->stop();
    delete httpServer;
    delete tcpServer;

    return 0;
}